package storage

import (
	"bytes"
	"errors"
	"fitness/go-admin/internal/model"
	"mime/multipart"
)

// StorageProvider 存储提供者接口
type StorageProvider interface {
	// SaveFile 保存文件，返回文件URL
	SaveFile(file multipart.File, fileName string, fileType model.FileType) (string, []byte, error)

	// SaveThumbnail 保存缩略图，返回缩略图URL
	SaveThumbnail(data []byte, fileName string) (string, []byte, error)

	// GetFile 获取文件内容
	GetFile(fileURL string) ([]byte, error)

	// DeleteFile 删除文件
	DeleteFile(fileURL string) error

	// GetStorageType 获取存储类型
	GetStorageType() model.StorageType
}

// StorageConfig 存储配置
type StorageConfig struct {
	Type       model.StorageType // 存储类型：local/database/oss/cos
	UploadPath string            // 本地存储路径
	BaseURL    string            // 访问基础URL

	// OSS配置（预留）
	OSSEndpoint        string
	OSSAccessKeyID     string
	OSSAccessKeySecret string
	OSSBucketName      string

	// COS配置（预留）
	COSRegion    string
	COSSecretID  string
	COSSecretKey string
	COSBucket    string
}

// NewStorageProvider 创建存储提供者
func NewStorageProvider(config *StorageConfig, db interface{}) (StorageProvider, error) {
	switch config.Type {
	case model.StorageTypeLocal:
		return NewLocalStorage(config), nil
	case model.StorageTypeDatabase:
		return NewDatabaseStorage(config, db), nil
	case model.StorageTypeOSS:
		return NewOSSStorage(config), nil
	case model.StorageTypeCOS:
		return NewCOSStorage(config), nil
	default:
		return nil, errors.New("不支持的存储类型")
	}
}

// ReadFileToBytes 从multipart.File读取到字节数组
func ReadFileToBytes(file multipart.File) ([]byte, error) {
	buf := new(bytes.Buffer)
	_, err := buf.ReadFrom(file)
	if err != nil {
		return nil, err
	}
	return buf.Bytes(), nil
}
